//---------------------------------------------------------------------------
#include <vcl.h>
#include "Eic.h"
#pragma hdrstop

#include "CImMosai.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
#define MODULE_TAG 1002

// ValidCtrCheck est utilisé pour être sûr que les composants créés ne
// contiennent aucune fonction virtuelle pure.
//
static inline void ValidCtrCheck(CImageMosaic *)
    {
    new CImageMosaic(NULL);
    }


//////////////////////////////////////
//
// CImageMosaic
//
// Fonction: Constructeur
//           Dessine une mosaique d'apres une image
//
// P.E.:
//
// P.S.: AUCUN
//
//////////////////////////////////////
__fastcall CImageMosaic::CImageMosaic(TComponent* Owner)
    : TGraphicControl(Owner)
    {
    FImag   = NULL;
    Align   = alClient;

    Canvas->CopyMode = cmSrcCopy;

    try
        {
        FImag = new TPicture();
        }

    catch( Exception &e )
        {
        EICDisplayException(TAG(10), e);
        }

    SendToBack();
    }



//////////////////////////////////////
//
// SetCenter
//
// Fonction: Centre l'image si celle-ci est de taille superieure au cadre
//
// P.E.: bCenter
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CImageMosaic::SetCenter( bool bCenter )
    {
    FCenter = bCenter;

    if( FImag->Width > Width && FImag->Height > Height )
        Repaint();
    }



//////////////////////////////////////
//
// SetPicture
//
// Fonction: Initialise le bitmap de fond
//
// P.E.: PPicture
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CImageMosaic::SetPicture( TPicture *PPicture )
    {
    FImag->Assign( PPicture );
    Repaint();
    }


//////////////////////////////////////
//
// GetPicture
//
// Fonction: Retourne le bitmap de fond
//
// P.E.: AUCUN
//
// P.S.: Picture
//
//////////////////////////////////////
TPicture * __fastcall CImageMosaic::GetPicture() const
    {
    return( FImag );
    }



//////////////////////////////////////
//
// DrawMosaic
//
// Fonction: Remplit le Canvas avec la mosaique calculee de l'image
//
// P.E.: AUCUN
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CImageMosaic::DrawMosaic()
    {
    int     i = 0;
    int     j = 0;
    TRect   R;

    R = Canvas->ClipRect;

    if( FCenter && ( FImag->Width > Width && FImag->Height > Height ))
        Canvas->Draw( (Width-FImag->Width)/2, (Height-FImag->Height)/2, FImag->Bitmap );
    else if( !FCenter && ( FImag->Width > Width && FImag->Height > Height ))
        Canvas->Draw( 0, 0, FImag->Bitmap );
    else
        {
        while( j < R.Bottom )
            {
            while( i < R.Right )
                {
                Canvas->Draw( i, j, FImag->Bitmap );
                i += FImag->Width;
                }
            i = 0;
            j += FImag->Height;
            }
        }
    }


//////////////////////////////////////
//
// PAint
//
// Fonction: Redessine le composant
//
// P.E.: AUCUN
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CImageMosaic::Paint(void)
    {
    SendToBack();
    
    if( !FImag->Bitmap->Empty )
        DrawMosaic();
    else if( ComponentState.Contains( csDesigning ))
        {
        Canvas->Brush->Color    = clRed;
        Canvas->Brush->Color    = clBtnFace;
        Canvas->FrameRect( Canvas->ClipRect );
        }
    }


//////////////////////////////////////
//
// WndProc
//
// Fonction: Intercepte les evenements
//
// P.E.: Le message
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CImageMosaic::WndProc( TMessage &Message )
    {
    switch( Message.Msg )
        {
        case WM_NCPAINT:
            {
            Paint();
            break;
            }
        }
    inherited::WndProc( Message );
    }


/*******************************************************************************
__fastcall ~CImageMosaic ();

Fonction : Destructeur

*******************************************************************************/
__fastcall CImageMosaic::~CImageMosaic ()
{
try
   {
   Picture->Bitmap->FreeImage ();
   delete FImag;          FImag = NULL;
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(20), e);
   }
}

namespace Cimmosai
{
    void __fastcall PACKAGE Register()
    {
        TComponentClass classes[1] = {__classid(CImageMosaic)};
        RegisterComponents("EIC Ctrlstd", classes, 0);
    }
}
//---------------------------------------------------------------------------
